home *** CD-ROM | disk | FTP | other *** search
-
- // I_SOUND.C
-
- #include <stdio.h>
- #include "doomdef.h"
- #include "dmx.h"
- #include "sounds.h"
- #include "i_sound.h"
-
- /*
- ===============
- =
- = I_StartupTimer
- =
- ===============
- */
-
- int tsm_ID = -1;
-
- void I_StartupTimer (void)
- {
- #ifndef NOTIMER
- extern int I_TimerISR(void);
-
- tprintf("I_StartupTimer()\n",0);
- // installs master timer. Must be done before StartupTimer()!
- TSM_Install(SND_TICRATE);
- tsm_ID = TSM_NewService (I_TimerISR, 35, 255, 0); // max priority
- if (tsm_ID == -1)
- {
- I_Error("Can't register 35 Hz timer w/ DMX library");
- }
- #endif
- }
-
- void I_ShutdownTimer (void)
- {
- TSM_DelService(tsm_ID);
- TSM_Remove();
- }
-
- /*
- *
- * SOUND HEADER & DATA
- *
- *
- */
-
- // sound information
- #if 0
- const char *dnames[] = {"None",
- "PC_Speaker",
- "Adlib",
- "Sound_Blaster",
- "ProAudio_Spectrum16",
- "Gravis_Ultrasound",
- "MPU",
- "AWE32"
- };
- #endif
-
- const char snd_prefixen[] = { 'P', 'P', 'A', 'S', 'S', 'S', 'M',
- 'M', 'M', 'S' };
-
- int snd_Channels;
- int snd_DesiredMusicDevice, snd_DesiredSfxDevice;
- int snd_MusicDevice, // current music card # (index to dmxCodes)
- snd_SfxDevice, // current sfx card # (index to dmxCodes)
- snd_MaxVolume, // maximum volume for sound
- snd_MusicVolume; // maximum volume for music
- int dmxCodes[NUM_SCARDS]; // the dmx code for a given card
-
- int snd_SBport, snd_SBirq, snd_SBdma; // sound blaster variables
- int snd_Mport; // midi variables
-
- extern boolean snd_MusicAvail, // whether music is available
- snd_SfxAvail; // whether sfx are available
-
- void I_PauseSong(int handle)
- {
- MUS_PauseSong(handle);
- }
-
- void I_ResumeSong(int handle)
- {
- MUS_ResumeSong(handle);
- }
-
- void I_SetMusicVolume(int volume)
- {
- MUS_SetMasterVolume(volume*8);
- // snd_MusicVolume = volume;
- }
-
- void I_SetSfxVolume(int volume)
- {
- snd_MaxVolume = volume; // THROW AWAY?
- }
-
- /*
- *
- * SONG API
- *
- */
-
- int I_RegisterSong(void *data)
- {
- int rc = MUS_RegisterSong(data);
- #ifdef SNDDEBUG
- if (rc<0) printf("MUS_Reg() returned %d\n", rc);
- #endif
- return rc;
- }
-
- void I_UnRegisterSong(int handle)
- {
- int rc = MUS_UnregisterSong(handle);
- #ifdef SNDDEBUG
- if (rc < 0) printf("MUS_Unreg() returned %d\n", rc);
- #endif
- }
-
- int I_QrySongPlaying(int handle)
- {
- int rc = MUS_QrySongPlaying(handle);
- #ifdef SNDDEBUG
- if (rc < 0) printf("MUS_QrySP() returned %d\n", rc);
- #endif
- return rc;
- }
-
- // Stops a song. MUST be called before I_UnregisterSong().
-
- void I_StopSong(int handle)
- {
- int rc;
- rc = MUS_StopSong(handle);
- #ifdef SNDDEBUG
- if (rc < 0) printf("MUS_StopSong() returned %d\n", rc);
- #endif
- // Fucking kluge pause
- {
- int s;
- extern volatile int ticcount;
- for (s=ticcount ; ticcount - s < 10 ; );
- }
- }
-
- void I_PlaySong(int handle, boolean looping)
- {
- int rc;
- rc = MUS_ChainSong(handle, looping ? handle : -1);
- #ifdef SNDDEBUG
- if (rc < 0) printf("MUS_ChainSong() returned %d\n", rc);
- #endif
- rc = MUS_PlaySong(handle, snd_MusicVolume);
- #ifdef SNDDEBUG
- if (rc < 0) printf("MUS_PlaySong() returned %d\n", rc);
- #endif
-
- }
-
- /*
- *
- * SOUND FX API
- *
- */
-
- // Gets lump nums of the named sound. Returns pointer which will be
- // passed to I_StartSound() when you want to start an SFX. Must be
- // sure to pass this to UngetSoundEffect() so that they can be
- // freed!
-
-
- int I_GetSfxLumpNum(sfxinfo_t *sound)
- {
- char namebuf[9];
-
- if(sound->name == 0)
- return 0;
- if (sound->link) sound = sound->link;
- // sprintf(namebuf, "d%c%s", snd_prefixen[snd_SfxDevice], sound->name);
- return W_GetNumForName(sound->name);
-
- }
-
- int I_StartSound (int id, void *data, int vol, int sep, int pitch, int priority)
- {
- /*
- // hacks out certain PC sounds
- if (snd_SfxDevice == PC
- && (data == S_sfx[sfx_posact].data
- || data == S_sfx[sfx_bgact].data
- || data == S_sfx[sfx_dmact].data
- || data == S_sfx[sfx_dmpain].data
- || data == S_sfx[sfx_popain].data
- || data == S_sfx[sfx_sawidl].data)) return -1;
-
- else
- */
- return SFX_PlayPatch(data, pitch, sep, vol, 0, 0);
-
- }
-
- void I_StopSound(int handle)
- {
- // extern volatile long gDmaCount;
- // long waittocount;
- SFX_StopPatch(handle);
- // waittocount = gDmaCount + 2;
- // while (gDmaCount < waittocount) ;
- }
-
- int I_SoundIsPlaying(int handle)
- {
- return SFX_Playing(handle);
- }
-
- void I_UpdateSoundParams(int handle, int vol, int sep, int pitch)
- {
- SFX_SetOrigin(handle, pitch, sep, vol);
- }
-
- /*
- *
- * SOUND STARTUP STUFF
- *
- *
- */
-
- //
- // Why PC's Suck, Reason #8712
- //
-
- void I_sndArbitrateCards(void)
- {
- char tmp[160];
- boolean gus, adlib, pc, sb, midi;
- int i, rc, mputype, p, opltype, wait, dmxlump;
-
- // snd_MaxVolume = 127;
- //Damn you, Dave Taylor!
-
- snd_MusicDevice = snd_DesiredMusicDevice;
- snd_SfxDevice = snd_DesiredSfxDevice;
-
- // check command-line parameters- overrides config file
- //
- if (M_CheckParm("-nosound")) snd_MusicDevice = snd_SfxDevice = snd_none;
- if (M_CheckParm("-nosfx")) snd_SfxDevice = snd_none;
- if (M_CheckParm("-nomusic")) snd_MusicDevice = snd_none;
-
- if (snd_MusicDevice > snd_MPU && snd_MusicDevice <= snd_MPU3)
- snd_MusicDevice = snd_MPU;
- if (snd_MusicDevice == snd_SB)
- snd_MusicDevice = snd_Adlib;
- if (snd_MusicDevice == snd_PAS)
- snd_MusicDevice = snd_Adlib;
-
- // figure out what i've got to initialize
- //
- gus = snd_MusicDevice == snd_GUS || snd_SfxDevice == snd_GUS;
- sb = snd_SfxDevice == snd_SB || snd_MusicDevice == snd_SB;
- adlib = snd_MusicDevice == snd_Adlib ;
- pc = snd_SfxDevice == snd_PC;
- midi = snd_MusicDevice == snd_MPU;
-
- // initialize whatever i've got
- //
- if (gus)
- {
- if (GF1_Detect()) tprintf("Dude. The GUS ain't responding.\n",1);
- else
- {
- dmxlump = W_GetNumForName("dmxgus");
- GF1_SetMap(W_CacheLumpNum(dmxlump, PU_CACHE), lumpinfo[dmxlump].size);
- }
-
- }
- if (sb)
- {
- if(debugmode)
- {
- sprintf(tmp,"cfg p=0x%x, i=%d, d=%d\n",
- snd_SBport, snd_SBirq, snd_SBdma);
- tprintf(tmp,0);
- }
- if (SB_Detect(&snd_SBport, &snd_SBirq, &snd_SBdma, 0))
- {
- sprintf(tmp,"SB isn't responding at p=0x%x, i=%d, d=%d\n",
- snd_SBport, snd_SBirq, snd_SBdma);
- tprintf(tmp,0);
- }
- else SB_SetCard(snd_SBport, snd_SBirq, snd_SBdma);
-
- if(debugmode)
- {
- sprintf(tmp,"SB_Detect returned p=0x%x,i=%d,d=%d\n",
- snd_SBport, snd_SBirq, snd_SBdma);
- tprintf(tmp,0);
- }
- }
-
- if (adlib)
- {
- if (AL_Detect(&wait,0))
- tprintf("Dude. The Adlib isn't responding.\n",1);
- else
- AL_SetCard(wait, W_CacheLumpName("genmidi", PU_STATIC));
- }
-
- if (midi)
- {
- if (debugmode)
- {
- sprintf(tmp,"cfg p=0x%x\n", snd_Mport);
- tprintf(tmp,0);
- }
-
- if (MPU_Detect(&snd_Mport, &i))
- {
- sprintf(tmp,"The MPU-401 isn't reponding @ p=0x%x.\n", snd_Mport);
- tprintf(tmp,0);
- }
- else MPU_SetCard(snd_Mport);
- }
-
- }
-
- // inits all sound stuff
-
- void I_StartupSound (void)
- {
- char tmp[80];
- int rc, i;
-
- if (debugmode)
- tprintf("I_StartupSound: Hope you hear a pop.\n",1);
-
- // initialize dmxCodes[]
- dmxCodes[0] = 0;
- dmxCodes[snd_PC] = AHW_PC_SPEAKER;
- dmxCodes[snd_Adlib] = AHW_ADLIB;
- dmxCodes[snd_SB] = AHW_SOUND_BLASTER;
- dmxCodes[snd_PAS] = AHW_MEDIA_VISION;
- dmxCodes[snd_GUS] = AHW_ULTRA_SOUND;
- dmxCodes[snd_MPU] = AHW_MPU_401;
- dmxCodes[snd_AWE] = AHW_AWE32;
-
- // inits sound library timer stuff
- I_StartupTimer();
-
- // pick the sound cards i'm going to use
- //
- I_sndArbitrateCards();
-
- if (debugmode)
- {
- sprintf(tmp," Music device #%d & dmxCode=%d", snd_MusicDevice,
- dmxCodes[snd_MusicDevice]);
- tprintf(tmp,0);
- sprintf(tmp," Sfx device #%d & dmxCode=%d\n", snd_SfxDevice,
- dmxCodes[snd_SfxDevice]);
- tprintf(tmp,0);
- }
-
- // inits DMX sound library
- tprintf(" calling DMX_Init",0);
- rc = DMX_Init(SND_TICRATE, SND_MAXSONGS, dmxCodes[snd_MusicDevice],
- dmxCodes[snd_SfxDevice]);
-
- if (debugmode)
- {
- sprintf(tmp," DMX_Init() returned %d", rc);
- tprintf(tmp,0);
- }
-
- }
-
- // shuts down all sound stuff
-
- void I_ShutdownSound (void)
- {
- DMX_DeInit();
- I_ShutdownTimer();
- }
-
- void I_SetChannels(int channels)
- {
- WAV_PlayMode(channels, SND_SAMPLERATE);
- }
-